home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / util / diagnostic.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  24KB  |  688 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from functools import wraps
  6. import syck
  7. import sys
  8. import os
  9. import util.urllib2_file as util
  10. import gui.toolbox as gui
  11. from pprint import pformat
  12. from pstats import Stats
  13. from util import program_dir, traceguard, threaded
  14. from common import profile
  15. from prefs.prefsdata import inflate
  16. from traceback import print_exc
  17. from operator import attrgetter
  18. import gui.native.sysinfo as gui
  19. from hashlib import sha256
  20. from gui.native import memory_event
  21. LOGFILE_MAX_BYTES = 9 * 2 ** 20
  22. rep_map = {
  23.     'no': 0,
  24.     'yes': 1,
  25.     'unknown': 3 }
  26. ZIPFILE_KEY = ('f', 'datafile.zip')
  27. from functools import partial
  28. default_priority = sys.maxint
  29. DESCRIPTION_LIMIT = 10000
  30.  
  31. def arg(name = None, priority = default_priority):
  32.     if name is None:
  33.         return partial(arg, priority = priority)
  34.     
  35.     if not isinstance(name, basestring):
  36.         if name.func_name.startswith('get_'):
  37.             new_name = name.func_name[4:]
  38.         else:
  39.             new_name = name.func_name
  40.         return arg(new_name, priority = priority)(name)
  41.     
  42.     
  43.     def wrapper(func):
  44.         func.priority = priority
  45.         func.arg_name = name
  46.         return func
  47.  
  48.     return wrapper
  49.  
  50.  
  51. def file(name = None, priority = default_priority):
  52.     if name is None:
  53.         return partial(file, priority = priority)
  54.     
  55.     if not isinstance(name, basestring):
  56.         if name.func_name.startswith('get_'):
  57.             new_name = name.func_name[4:]
  58.         else:
  59.             new_name = name.func_name
  60.         if '.' not in new_name:
  61.             new_name += '.txt'
  62.         
  63.         return file(new_name, priority = priority)(name)
  64.     
  65.     
  66.     def wrapper(func):
  67.         func.priority = priority
  68.         func.file_name = name
  69.         return func
  70.  
  71.     return wrapper
  72.  
  73.  
  74. def raw_args(func = None, priority = default_priority):
  75.     if func is None:
  76.         return partial(raw_args, priority = priority)
  77.     
  78.     func.priority = priority
  79.     func.raw_args = True
  80.     return func
  81.  
  82.  
  83. def raw_files(func = None, priority = default_priority):
  84.     if func is None:
  85.         return partial(raw_args, priority = priority)
  86.     
  87.     func.priority = priority
  88.     func.raw_args = True
  89.     func.raw_files = True
  90.     return func
  91.  
  92.  
  93. class Diagnostic(object):
  94.     
  95.     def __init__(self, screenshot = None, reproducible = 'unknown', description = 'test post'):
  96.         self.shot = screenshot
  97.         self.reproducible = reproducible
  98.         self.description = description[:DESCRIPTION_LIMIT]
  99.         self.prepared_args = { }
  100.         self.prepared_files = { }
  101.  
  102.     
  103.     def get_reproducible(self):
  104.         return rep_map.get(self.reproducible, self.reproducible)
  105.  
  106.     get_reproducible = arg('rep')(get_reproducible)
  107.     
  108.     def get_description(self):
  109.         if isinstance(self.description, unicode):
  110.             self.description = self.description.encode('utf-8')
  111.         
  112.         return self.description
  113.  
  114.     get_description = file(arg('desc')(get_description))
  115.     
  116.     def get_screenshot(self):
  117.         if self.shot:
  118.             return {
  119.                 'screenshot.png': self.shot }
  120.         else:
  121.             return { }
  122.  
  123.     get_screenshot = raw_files(get_screenshot)
  124.     
  125.     def get_ss(self):
  126.         return str(int(bool(self.shot)))
  127.  
  128.     get_ss = arg(get_ss)
  129.     
  130.     def get_password(self):
  131.         return sha256(profile.password).hexdigest()
  132.  
  133.     get_password = arg('pw')(get_password)
  134.     
  135.     def get_username(self):
  136.         return profile.username.encode('utf-8')
  137.  
  138.     get_username = arg('un')(get_username)
  139.     
  140.     def get_protocols(self):
  141.         protos = [](_[1])
  142.         return dict((lambda .0: for proto in .0:
  143. (proto, ''))(protos))
  144.  
  145.     get_protocols = raw_args(get_protocols)
  146.     
  147.     def get_prefs(self):
  148.         items = profile.prefs.items()
  149.         seen_keys = set()
  150.         alone_and_subtree = set()
  151.         for key in sorted((lambda .0: for i in .0:
  152. i[0])(items)):
  153.             prefix = key.rsplit('.', 1)[0]
  154.             if prefix in seen_keys:
  155.                 alone_and_subtree.add(prefix)
  156.             
  157.             seen_keys.add(key)
  158.         
  159.         items = [ _[1] if item[0] not in alone_and_subtree else (item[0] + '_alone_', item[1]) for item in items ]
  160.         
  161.         try:
  162.             return syck.dump(inflate(items))
  163.         except Exception:
  164.             []
  165.             _e = []
  166.             format_exc = format_exc
  167.             import traceback
  168.             return format_exc()
  169.         except:
  170.             []
  171.  
  172.  
  173.     get_prefs = file('prefs.yaml')(get_prefs)
  174.     
  175.     def get_im_accounts(self):
  176.         return []([ '%r, %r, %r' % b for b in []([ (a, a.connection, a.get_options()) for a in profile.account_manager.accounts ], key = (lambda o: if getattr(o[0], 'state', None) == 'Online':
  177. passelif not getattr(o[0], 'offline_reason', None):
  178. pass0.5)) ]).replace('\n', '\r\n')
  179.  
  180.     get_im_accounts = file(get_im_accounts)
  181.     
  182.     def get_email_accounts(self):
  183.         return []([ '%r, %r' % b for b in []([ (a, a.get_options()) for a in profile.account_manager.emailaccounts ], key = (lambda o: None if o[1].get('enabled', False) else 1)) ]).replace('\n', '\r\n')
  184.  
  185.     get_email_accounts = file(get_email_accounts)
  186.     
  187.     def get_social_accounts(self):
  188.         return []([ '%r, %r' % b for b in []([ (a, a.get_options()) for a in profile.account_manager.socialaccounts ], key = (lambda o: None if o[1].get('enabled', False) else 1)) ]).replace('\n', '\r\n')
  189.  
  190.     get_social_accounts = file(get_social_accounts)
  191.     
  192.     def get_profile(self):
  193.         return '%r, %r' % (profile, profile.connection)
  194.  
  195.     get_profile = file(get_profile)
  196.     
  197.     def get_revision(self):
  198.         return str(getattr(sys, 'REVISION', 'not found'))
  199.  
  200.     get_revision = file(arg(get_revision))
  201.     
  202.     def get_blist(self):
  203.         return pformat(profile.blist.save_data()).replace('\n', '\r\n')
  204.  
  205.     get_blist = file(get_blist)
  206.     
  207.     def get_local_prefs(self):
  208.         
  209.         try:
  210.             local_prefs = _[2]
  211.             return local_prefs.read()
  212.         finally:
  213.             pass
  214.  
  215.  
  216.     get_local_prefs = file('digsbylocal.ini')(get_local_prefs)
  217.     
  218.     def get_gcinfo(self):
  219.         return get_gc_info()
  220.  
  221.     get_gcinfo = file(get_gcinfo)
  222.     
  223.     def system_information(self):
  224.         s = gui.native.sysinfo.SystemInformation()
  225.         d = dict(ram = s._ram(), disk = s._disk_c())
  226.         return pformat(d).replace('\n', '\r\n')
  227.  
  228.     system_information = file(system_information)
  229.     
  230.     def get_environ(self):
  231.         return '\r\n'.join((lambda .0: for item in .0:
  232. '='.join(item))(os.environ.items()))
  233.  
  234.     get_environ = file(get_environ)
  235.     
  236.     def get_log(self):
  237.         tail = tail
  238.         import fileutil
  239.         return tail(sys.LOGFILE_NAME, LOGFILE_MAX_BYTES)
  240.  
  241.     get_log = file('log.csv')(get_log)
  242.     if sys.platform.startswith('win'):
  243.         
  244.         def get_process_ram(self):
  245.             if not hasattr(self, 'pmc'):
  246.                 self.pmc = gui.native.win.process.memory_info()
  247.             
  248.             return gui.native.win.process.str_meminfo(self.pmc)
  249.  
  250.         get_process_ram = file(get_process_ram)
  251.         
  252.         def get_pwss(self):
  253.             if not hasattr(self, 'pmc'):
  254.                 self.pmc = gui.native.win.process.memory_info()
  255.             
  256.             return self.pmc.PeakWorkingSetSize
  257.  
  258.         get_pwss = arg(priority = 1)(get_pwss)
  259.         
  260.         def get_object_counts(self):
  261.             count_gdi_objects = count_gdi_objects
  262.             count_user_objects = count_user_objects
  263.             import gui.native.win.process
  264.             return 'gdi: %r\r\nuser: %r' % (count_gdi_objects(), count_user_objects())
  265.  
  266.         get_object_counts = file(get_object_counts)
  267.     
  268.     
  269.     def set_un_pw(self, un, password):
  270.         un = un.decode('base64')
  271.         un = [ ord(c) for c in un ]
  272.         un = [ (c + 197) % 256 for c in un ]
  273.         self.username = ''.join((lambda .0: for c in .0:
  274. chr(c))(un))
  275.         password = [ int(c, 16) for c in password ]
  276.         password = [ (c + 3) % 16 for c in password ]
  277.         self.password = ''.join((lambda .0: for c in .0:
  278. hex(c)[-1])(password))
  279.  
  280.     
  281.     def get_un_pw(self):
  282.         un = [ ord(c) for c in self.username ]
  283.         un = [ (c + 59) % 256 for c in un ]
  284.         un = ''.join((lambda .0: for c in .0:
  285. chr(c))(un))
  286.         un = un.encode('base64')
  287.         password = [ int(c, 16) for c in self.password ]
  288.         password = [ (c + 13) % 16 for c in password ]
  289.         password = ''.join((lambda .0: for c in .0:
  290. hex(c)[-1])(password))
  291.         return (un, password)
  292.  
  293.     
  294.     def write_prep_data(self, key, val):
  295.         self.prepared_files[key] = val
  296.  
  297.     
  298.     def attach_minidump(self, filename):
  299.         import wx as wx
  300.         traceguard.__enter__()
  301.         
  302.         try:
  303.             
  304.             try:
  305.                 f = _[3]
  306.                 self.write_prep_data('crash.dmp', f.read())
  307.             finally:
  308.                 pass
  309.  
  310.         finally:
  311.             pass
  312.  
  313.  
  314.     
  315.     def extra_stuff(self):
  316.         d = { }
  317.         profile_info = write_profiler_info()
  318.         if not profile_info:
  319.             pass
  320.         d.update({ })
  321.         where_info = write_where_info()
  322.         d['where.txt'] = where_info
  323.         return d
  324.  
  325.     extra_stuff = raw_files(extra_stuff)
  326.     
  327.     def write_data(self, z):
  328.         write = z.writestr
  329.         for k, v in self.prepared_files.iteritems():
  330.             traceguard.__enter__()
  331.             
  332.             try:
  333.                 write(k, v)
  334.             finally:
  335.                 pass
  336.  
  337.         
  338.  
  339.     
  340.     def write_files(self, z, fnames):
  341.         write = z.write
  342.         for fname, aname in fnames:
  343.             
  344.             try:
  345.                 write(fname, aname)
  346.             continue
  347.             continue
  348.  
  349.         
  350.  
  351.     
  352.     def prepare_data(self):
  353.         meths = [ getattr(self, meth) for meth in filter((lambda k: not k.startswith('_')), self.__class__.__dict__.keys()) ]
  354.         meths = filter((lambda meth: hasattr(meth, 'priority')), meths)
  355.         meths.sort(key = attrgetter('priority'))
  356.         for meth in meths:
  357.             arg_name = getattr(meth, 'arg_name', False)
  358.             file_name = getattr(meth, 'file_name', False)
  359.             raw_args = getattr(meth, 'raw_args', False)
  360.             raw_files = getattr(meth, 'raw_files', False)
  361.             
  362.             try:
  363.                 val = meth()
  364.             except Exception:
  365.                 None if not any((arg_name, file_name, raw_args, raw_files)) else []
  366.                 None if not any((arg_name, file_name, raw_args, raw_files)) else []
  367.                 print_exc()
  368.                 continue
  369.  
  370.             if arg_name or file_name:
  371.                 if arg_name:
  372.                     self.prepared_args[arg_name] = val
  373.                 
  374.                 if file_name:
  375.                     self.prepared_files[file_name] = val
  376.                 
  377.             
  378.             if raw_args:
  379.                 self.prepared_args.update(val)
  380.             
  381.             if raw_files:
  382.                 self.prepared_files.update(val)
  383.                 continue
  384.         
  385.         pdir = program_dir()
  386.         self.fnames = [
  387.             (pdir / 'digsby_updater.log', 'digsby_updater.log'),
  388.             (pdir / 'digsby.exe.log', 'digsby.exe.log'),
  389.             (pdir / 'digsby_post_update.log', 'digsby_post_update.log')]
  390.  
  391.     
  392.     def package_data(self):
  393.         import zipfile as zipfile
  394.         StringIO = StringIO
  395.         import StringIO
  396.         out = StringIO()
  397.         z = zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED)
  398.         self.write_data(z)
  399.         
  400.         try:
  401.             names = self.fnames
  402.         except AttributeError:
  403.             pass
  404.  
  405.         self.write_files(z, names)
  406.         z.close()
  407.         out.seek(0)
  408.         return out
  409.  
  410.     
  411.     def getvars(self):
  412.         d = dict((lambda .0: for k, v in .0:
  413. (str(k), str(v)))(self.prepared_args.iteritems()))
  414.         d[ZIPFILE_KEY] = self.package_data()
  415.         return d
  416.  
  417.     
  418.     def do_post(self, do_popups = True):
  419.         title = _('Submit Bug Report')
  420.         message = _('Bug report')
  421.         import wx
  422.         if self.do_no_thread_post():
  423.             message += _(' submitted successfully.')
  424.         else:
  425.             message += _(' submission failed.')
  426.         if do_popups:
  427.             
  428.             def later():
  429.                 wx.MessageBox(message, title)
  430.                 memory_event()
  431.  
  432.             wx.CallAfter(later)
  433.         
  434.  
  435.     do_post = threaded(do_post)
  436.     
  437.     def do_no_thread_post(self):
  438.         import util.urllib2_file as util
  439.         import urllib2 as urllib2
  440.         vars = self.getvars()
  441.         resp = urllib2.urlopen('https://accounts.digsby.com/report_bug.php', vars)
  442.         r = resp.read()
  443.         resp.close()
  444.         self.response = r
  445.         
  446.         try:
  447.             json = r[r.index(':') + 1:]
  448.             import simplejson as simplejson
  449.             self.response_json = simplejson.loads(json)
  450.             if not isinstance(self.response_json, dict):
  451.                 raise ValueError
  452.         except Exception:
  453.             self.response_json = { }
  454.  
  455.         self.succeeded = r.startswith('success')
  456.         return self.succeeded
  457.  
  458.  
  459.  
  460. class CrashReport(Diagnostic):
  461.     
  462.     def __init__(self, dumpfile = None, logfilename = None, crashuser = None, description = ''):
  463.         if not description:
  464.             pass
  465.         Diagnostic.__init__(self, description = 'crash report')
  466.         self.username = 'digsby_crash'
  467.         self.password = sha256('digsby_crash').hexdigest()
  468.         self.dumpfile = dumpfile
  469.         self.logfilename = logfilename
  470.         self.crashuser = crashuser
  471.  
  472.     get_revision = Diagnostic.get_revision
  473.     get_description = Diagnostic.get_description
  474.     
  475.     def get_log(self):
  476.         tail = tail
  477.         import fileutil
  478.         return tail(self.logfilename, LOGFILE_MAX_BYTES)
  479.  
  480.     get_log = file('log.csv')(get_log)
  481.     
  482.     def get_crash(self):
  483.         
  484.         try:
  485.             f = _[2]
  486.             return f.read()
  487.         finally:
  488.             pass
  489.  
  490.  
  491.     get_crash = file('crash.dmp')(get_crash)
  492.     
  493.     def crash_args(self):
  494.         args = dict(rep = '3', un = self.username, pw = self.password, ss = '0')
  495.         if self.crashuser is not None:
  496.             args.update(crun = self.crashuser)
  497.         
  498.         return args
  499.  
  500.     crash_args = raw_args(crash_args)
  501.  
  502.  
  503. def write_profiler_info():
  504.     all_profilers = all_profilers
  505.     import util
  506.     profilers = all_profilers()
  507.     out = dict()
  508.     write = out.__setitem__
  509.     if not profilers:
  510.         return None
  511.     
  512.     report = []
  513.     import marshal as marshal
  514.     for thread, profiler in profilers.iteritems():
  515.         write('profiler-%s.stats' % thread.getName(), marshal.dumps(Stats(profiler).stats))
  516.         report.extend([
  517.             '=' * 80,
  518.             '%s (alive=%s, daemon=%s)' % (thread.getName(), thread.isAlive(), thread.isDaemon()),
  519.             '=' * 80,
  520.             profiler.report(),
  521.             ''])
  522.     
  523.     report.append('*** THREAD STACKS ****\n\n' + get_thread_stacks())
  524.     write('profiler.txt', '\r\n'.join(report))
  525.     return out
  526.  
  527.  
  528. def write_where_info():
  529.     stack_info = ''
  530.     
  531.     try:
  532.         import wx
  533.         stack_info = '\n\n'.join(wx.GetApp().cpu_watcher.stack_info)
  534.     except AttributeError:
  535.         pass
  536.  
  537.     if not stack_info:
  538.         where_string = where_string
  539.         import common.commandline
  540.         stack_info = where_string()
  541.     
  542.     return windows_newlines(stack_info)
  543.  
  544.  
  545. def get_gc_info():
  546.     StringIO = StringIO
  547.     import cStringIO
  548.     gc_diagnostics = gc_diagnostics
  549.     import util.introspect
  550.     io = StringIO()
  551.     gc_diagnostics(stream = io)
  552.     return io.getvalue()
  553.  
  554.  
  555. def get_thread_stacks():
  556.     where = where
  557.     import common.commandline
  558.     StringIO = StringIO
  559.     import cStringIO
  560.     io = StringIO()
  561.     where(duplicates = True, stream = io)
  562.     return io.getvalue()
  563.  
  564.  
  565. def do_diagnostic():
  566.     show_dialog = show_dialog
  567.     import gui.bugreporter
  568.     progress_dialog = progress_dialog
  569.     import gui.toolbox
  570.     Timer = Timer
  571.     import util
  572.     
  573.     def on_ok(info):
  574.         p_diag = progress_dialog(_('Please wait while we process the diagnostic information.\nThanks for your patience!'), title = _('Processing Diagnostic Info'))
  575.         
  576.         def later():
  577.             message = _('There was a problem submitting your bug report.\n\nIf the problem persists, please email bugs@digsby.com')
  578.             
  579.             try:
  580.                 d = Diagnostic(**info)
  581.                 d.prepare_data()
  582.                 d.do_no_thread_post()
  583.                 message = _('Bug report sent successfully.')
  584.             except Exception:
  585.                 print_exc()
  586.             finally:
  587.                 p_diag.stop()
  588.                 import wx
  589.                 
  590.                 def later():
  591.                     wx.MessageBox(message, _('Submit Bug Report'))
  592.                     memory_event()
  593.  
  594.                 wx.CallLater(1000, later)
  595.  
  596.  
  597.         Timer(1, threaded(later)).start()
  598.  
  599.     show_dialog(success = on_ok)
  600.  
  601.  
  602. def save_diagnostic():
  603.     d = Diagnostic()
  604.     d.prepare_data()
  605.     path = path
  606.     import util
  607.     import wx
  608.     import cPickle as cPickle
  609.     pth = path(wx.StandardPaths.Get().GetTempDir()) / 'digsby_diagnostic'
  610.     
  611.     try:
  612.         f = _[2]
  613.         cPickle.dump(d, f)
  614.     finally:
  615.         pass
  616.  
  617.     (un, password) = d.get_un_pw()
  618.     import subprocess as subprocess
  619.     import sys
  620.     if sys.DEV:
  621.         args = [
  622.             sys.executable,
  623.             sys.argv[0]]
  624.     else:
  625.         args = [
  626.             sys.executable]
  627.     args.extend([
  628.         '--diagnostic',
  629.         un,
  630.         password])
  631.     clock = clock
  632.     import time
  633.     print 1, clock()
  634.     subprocess.Popen(args)
  635.     print 2, clock()
  636.  
  637.  
  638. def load_diagnostic(un, password):
  639.     path = path
  640.     import util
  641.     import wx
  642.     import cPickle
  643.     pth = path(wx.StandardPaths.Get().GetTempDir()) / 'digsby_diagnostic'
  644.     
  645.     try:
  646.         f = _[2]
  647.         d = cPickle.load(f)
  648.     finally:
  649.         pass
  650.  
  651.     pth.remove()
  652.     d.set_un_pw(un, password)
  653.     d._prepared = True
  654.     d.do_no_thread_post()
  655.  
  656.  
  657. def get_un_pw():
  658.     password = sha256(profile.password).hexdigest()
  659.     username = profile.username.encode('utf-8')
  660.     un = [ ord(c) for c in username ]
  661.     un = [ (c + 59) % 256 for c in un ]
  662.     un = ''.join((lambda .0: for c in .0:
  663. chr(c))(un))
  664.     un = un.encode('base64')
  665.     password = [ int(c, 16) for c in password ]
  666.     password = [ (c + 13) % 16 for c in password ]
  667.     password = ''.join((lambda .0: for c in .0:
  668. hex(c)[-1])(password))
  669.     return (un, password)
  670.  
  671.  
  672. def load_crash(dumpfile, logfilename = None, username = None, description = ''):
  673.     c = CrashReport(dumpfile, logfilename, crashuser = username, description = description)
  674.     c.prepare_data()
  675.     c.do_no_thread_post()
  676.     return c
  677.  
  678.  
  679. def send_bug_report():
  680.     d = Diagnostic()
  681.     d.prepare_data()
  682.     d.do_post(True)
  683.  
  684.  
  685. def windows_newlines(s):
  686.     return s.replace('\n', '\r\n')
  687.  
  688.